"""首页路由/视图函数"""

from flask import current_app, jsonify
from flask import g
from flask import render_template
from flask import request

from app import constants
from app.models import User, News, Category
from app.utils.common import user_login_data
from app.utils.response_code import RET
from . import index_blu


# 根路由---这里补上蓝图的使用及使用redis对象存储key-value数据
@index_blu.route('/')
@user_login_data
def index():
    # 获取点击排行数据
    news_list = None
    try:
        news_list = News.query.order_by(News.clicks.desc()).limit(constants.CLICK_RANK_MAX_NEWS).all()
        # print(news_list)   [<News 1086>, <News 134>, <News 297>, <News 86>, <News 166>, <News 208>] TODO news_list中元素是什么
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="数据库查询新闻失败")
    # 这里才是真正的点击排行数据
    click_news_list = []
    for news in news_list if news_list else []:
        click_news_list.append(news.to_dict())

    # 获取新闻分类栏目
    try:
        categories = Category.query.all()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR,errmsg="新闻分类栏目查询异常")
    # 定义列表保存分类数据
    categories_dict = []
    for category in categories if categories else None:
        categories_dict.append(category.to_dict())

    # 新闻列表数据

    # user_info: 获取当前登录用户的信息
    data = {
        "user_info": g.user.to_dict() if g.user else None,
        "click_news_list": click_news_list,
        "categories": categories_dict
    }

    return render_template('news/index.html', data=data)


"""
请求方式:GET
传入参数:cid/page/per_page  传入格式json
返回参数类型:json格式
127.0.0.1:5000/newslist?cid=x&page=1&per_page=10
"""
@index_blu.route('/newslist')
def get_news_list():
    """获取新闻列表数据后端接口(GET)"""
    # 获取参数
    args_dict = request.args
    page = args_dict.get('p', '1')
    per_page = args_dict.get('per_page', constants.HOME_PAGE_MAX_NEWS)
    category_id = args_dict.get("cid", '1')
    # 校验参数
    try:
        page = int(page)
        per_page = int(per_page)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.PARAMERR, errmsg="参数错误")
    # 查询数据并分页
    filters = []  # 分类条件列表
    # 如果分类id不为1.那么添加分类id的过滤到分类条件列表
    if category_id != "1":
        filters.append(News.category_id == category_id)
    # News.category_id == category_id表示的是一个布尔值,在sqlalchemy底层有重写__eq__方法,改变了该返回值,使得在News.query.filter(*filters)时的参数返回的是一个查询条件,这里*filters表示解包
    try:
        paginate = News.query.filter(*filters).order_by(News.create_time.desc()).paginate(page, per_page, False)
        # print(paginate)  # 参数error_out=False表示不抛出异常(抛出的是404 response)
        # 获取查询出来的数据
        items = paginate.items
        # 获取到总页数
        total_page = paginate.pages
        current_page = paginate.page
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="数据查询失败")
    news_li = []  # 新闻列表
    for news in items:
        news_li.append(news.to_basic_dict())
    # 返回数据
    return jsonify(errno=RET.OK, errmsg="OK",totalPage=total_page,currentPage=current_page,newsList=news_li, cid=category_id)





@index_blu.route('/favicon.ico')
def favicon():
    # 这里又出现了current_app TODO current_app
    # send_static_file这个方法默认在静态文件夹static下找
    return current_app.send_static_file('news/favicon.ico')
